/*这个.hpp文件是对spdlog的一个二次封装*/

#ifndef __CHATSYSTEM_LOGGER_H__
#define __CHATSYSTEM_LOGGER_H__

#include <iostream>
#include <string>
#include <spdlog/spdlog.h>
#include <spdlog/async.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>

namespace ChatSystem
{

    std::shared_ptr<spdlog::logger> g_default_logger;

    //mode表示运行模式：true是运行模式，false是调试模式； 
    void InitLogger(bool mode, const std::string& file, int32_t level)
    {
        //如果是调试模式， 则创建标准输出日志器，输出等级为最低
        if(mode == false)
        {
            g_default_logger = spdlog::stdout_color_mt("default-logger");
            spdlog::set_level(spdlog::level::level_enum::trace);
            spdlog::flush_on(spdlog::level::level_enum::trace);
        }
        else//否则是发布模式，则创建文件输出日志器，输出等级根据参数决定
        {
            g_default_logger = spdlog::basic_logger_mt("default-logger", file);
            g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
            g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));
        }
        g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
    }

    #define LOG_TRACE(format, ...) g_default_logger->trace(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
    #define LOG_DEBUG(format, ...) g_default_logger->debug(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
    #define LOG_INFO(format, ...) g_default_logger->info(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
    #define LOG_WARN(format, ...) g_default_logger->warn(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
    #define LOG_ERROR(format, ...) g_default_logger->error(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
    #define LOG_FATAL(format, ...) g_default_logger->critical(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);

}

#endif